package com.nageoffer.shortlink.project.mq.idempotent;

import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 *
 * 由于stream消息队列只能保证每个消息都会被消费，而无法保证被消费的次数
 * 因此需要消息队列幂等处理（使用redis setnx缓存幂等标识），保证一个消息只能被消费一次
 */
@Component
@RequiredArgsConstructor
public class MQIdempotentHandler {
    private final StringRedisTemplate stringRedisTemplate;
    private static final String IDEMPOTENT_KEY_PREFIX="short-link:idempotent";

    /**
     * redis setNX判断当前消息是否消费
     * @param messageId 消息标识
     * @return 消息是否已经消费
     */
    public boolean isMessageProcessed(String messageId){
        String key = IDEMPOTENT_KEY_PREFIX + messageId;
        return !Boolean.TRUE.equals(stringRedisTemplate.opsForValue().setIfAbsent(key,"",2, TimeUnit.MINUTES));
    }
    /**
     * 消息处理异常则删除消息幂等标识
     * @param messageId 消息标识
     * @return
     */
    public void delMessageProcessed(String messageId){
        String key = IDEMPOTENT_KEY_PREFIX + messageId;
        stringRedisTemplate.delete(key);
    }
}
